package com.advert.boot.shared.sms.service.impl;

import cn.hutool.json.JSONUtil;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.advert.boot.config.property.AliyunSmsProperties;
import com.advert.boot.shared.sms.enums.SmsTypeEnum;
import com.advert.boot.shared.sms.service.SmsService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * 阿里云短信业务类
 *
 * @author Ray
 * @since 2024/8/17
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class AliyunSmsService implements SmsService {

    private final AliyunSmsProperties aliyunSmsProperties;

    /**
     * 发送短信验证码
     *
     * @param mobile         手机号 13388886666
     * @param smsType        短信模板 SMS_194640010
     * @param templateParams 模板参数 [{"code":"123456"}]
     * @return boolean 是否发送成功
     */
    @Override
    public boolean sendSms(String mobile, SmsTypeEnum smsType, Map<String, String> templateParams) {

        String templateCode = aliyunSmsProperties.getTemplates().get(smsType.getValue());

        DefaultProfile profile = DefaultProfile.getProfile(aliyunSmsProperties.getRegionId(),
                aliyunSmsProperties.getAccessKeyId(), aliyunSmsProperties.getAccessKeySecret());
        IAcsClient client = new DefaultAcsClient(profile);

        // 创建通用的请求对象
        CommonRequest request = new CommonRequest();
        // 指定请求方式
        request.setSysMethod(MethodType.POST);
        // 短信api的请求地址(固定)
        request.setSysDomain(aliyunSmsProperties.getDomain());
        // 签名算法版(固定)
        request.setSysVersion("2017-05-25");
        // 请求 API 的名称(固定)
        request.setSysAction("SendSms");
        // 指定地域名称
        request.putQueryParameter("RegionId", aliyunSmsProperties.getRegionId());
        // 要给哪个手机号发送短信  指定手机号
        request.putQueryParameter("PhoneNumbers", mobile);
        // 您的申请签名
        request.putQueryParameter("SignName", aliyunSmsProperties.getSignName());
        // 您申请的模板 code
        request.putQueryParameter("TemplateCode", templateCode);

        request.putQueryParameter("TemplateParam", JSONUtil.toJsonStr(templateParams));

        try {
            CommonResponse response = client.getCommonResponse(request);
            System.out.println("\t\n " + JSONUtil.toJsonStr(response));
            //打印失败日志
            boolean result = response.getHttpResponse().isSuccess();
            if (!result) {
                log.info("");
            }
            return result;
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return false;
    }


    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1); list.add(2); list.add(3); list.add(4); list.add(5);
        System.out.println(list);
        int index1 = 1; // 要交换的第一个元素的索引（基于0）
        int index2 = 3; // 要交换的第二个元素的索引（基于0）
        Collections.swap(list, index1, index2); // 对于List使用Collections.swap()方法进行交换。注意索引是基于0的。
        System.out.println(list); // 打印结果将显示交换后的列表。

        String[] array = {"a", "b", "c", "d", "e"}; // 示例为字符串数组，但同样适用于其他对象类型
        System.out.println(JSONUtil.toJsonStr(array));

        Integer[] array2 = {1, 3, 5, 7, 9};
        System.out.println(JSONUtil.toJsonStr(array2));


        String code = String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
        System.out.println(code);
    }
}
